package com.excel.service.excel;


import com.excel.model.ExcelImportConfig;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * Excel导入标准流程
 */
public interface ExcelImportProcessor<ERROR,DATA,TASK,PREINSERT>{


    /**
     * 组装数据
     */
    List<DATA> assembleListFromExcel(TASK task);

    /**
     * 组装数据 -- 仅为之前之前的excel导入
     */
    default  BizImportResult<ERROR, DATA> assembleListFromExcel(TASK task, MultipartFile file){
        return null;
    };

    /**
     * 普通校验--正则表达式、不能为空等等
     */
    BizImportResult<ERROR, DATA> checkExcelData(List<DATA> views);

    /**
     * db数据校验
     */
    default BizImportResult<ERROR, DATA> checkDbData(List<DATA> views){
        return null;
    }

    /**
     * db数据校验
     * return 错误数 ， excel数据 ， 需要新增的数据 示例--岗位，职级等
     */
    default BizImportPreInsertResult<ERROR, DATA, PREINSERT> checkDbDataWithPreInsert(List<DATA> views) {
        return null;
    }

    /**
     * db数据校验
     * return 错误数 ， excel数据 ， 需要新增的数据 示例--岗位，职级等
     */
    default BizImportPreInsertResult<ERROR, DATA, PREINSERT> checkDbDataWithPreInsert(List<DATA> views,TASK task) {
        return null;
    }

    /**
     * 数据权限校验 可选实现
     */
    default BizImportResult<ERROR, DATA> checkDataPermission(List<DATA> views){
        return null;
    }

    /**
     * 数据写入临时表
     */
    default BizImportResult<ERROR, DATA> tempWrite(List<DATA> datas){
        return null;
    };

    /**
     * 数据直接写入表
     */
    default void preWriteDB(List<DATA> datas,List<PREINSERT> preInserts){

    }

    /**
     * 记录错误日志
     */
    void writeErrorLog(List<ERROR> errors, TASK task);

    /**
     * 写入校验通过的数据
     */
    default void writeIfVerifyPassed(List<DATA> datas, TASK task){

    }

    /**
     * sendMq 可选实现
     */
    default void sendMqWithCache(TASK task, List<List<DATA>> partitions){}

    /**
     * sendDelayMq 可选实现
     */
    default void sendDelayCheckMq(TASK task){}


    String getTag();

    /**
     * 是否数据分片处理
     */
    default ExcelImportConfig getConfig(){
        return new ExcelImportConfig();
    };

}
